/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package algoritmo2.mutacion;

import algoritmo2.Arbol;
import algoritmo2.Individuo;
import algoritmo2.RandomPropio;
import java.util.ArrayList;

/**
 *
 * @author Ra
 */
public class MutacionPropia extends Mutacion {

    @Override
    public void mutacion(Individuo padre1) {

        ArrayList<String> cjtoTerIf = new ArrayList<String>();
        cjtoTerIf.add("A0");
        cjtoTerIf.add("A1");
        Arbol nodo = RandomPropio.dameNodoFuncional(padre1);
        int valor = RandomPropio.intRandom(0, padre1.getCjtoFun().size());
        String fun = padre1.getCjtoFun().get(valor);
        if(nodo.getNombre().equals("AND") || nodo.getNombre().equals("OR")){
            if(fun.equals("AND") || fun.equals("OR")){
                nodo.setNombre(fun);
            }
            else if(fun.equals("IF")){
                nodo.setNombre(fun);
                nodo.setRamaCondicionIf(new Arbol(padre1.getCjtoFun(), cjtoTerIf, padre1.getHmax(), nodo.getProfundidad()+1, nodo.getPadre(),
                false,false, false, padre1.isCompleta()));
            }
            else{
                nodo.setNombre(fun);
                nodo.setHi(null);
            }
        }
        else if(nodo.getNombre().equals("IF")){
            if(fun.equals("AND") || fun.equals("OR")){
                nodo.setNombre(fun);
                nodo.setRamaCondicionIf(null);
            }
            else if(fun.equals("IF")){
//                nodo.setNombre(fun);
//                nodo.setRamaCondicionIf(new Arbol(padre1.getCjtoFun(), cjtoTerIf, padre1.getHmax()-nodo.getProfTotal(), nodo.getProfTotal(), nodo.getPadre(),
//                nodo.isEsHi(), nodo.isRaiz(), nodo.isEsHd(), padre1.isCompleta()));
            }
            else{
                nodo.setNombre(fun);
                nodo.setHi(null);
                nodo.setRamaCondicionIf(null);
            }
        }
        else if(nodo.getNombre().equals("NOT")){
            if(fun.equals("AND") || fun.equals("OR")){
                nodo.setNombre(fun);
                nodo.setHi(new Arbol(padre1.getCjtoFun(), padre1.getCjtoTer(), padre1.getHmax(), nodo.getProfundidad()+1, nodo.getPadre(),
                true, false,false, padre1.isCompleta()));
            }
            else if(fun.equals("IF")){
                nodo.setNombre(fun);
                nodo.setHi(new Arbol(padre1.getCjtoFun(), padre1.getCjtoTer(), padre1.getHmax(), nodo.getProfundidad()+1, nodo.getPadre(),
                true, false, false, padre1.isCompleta()));
                nodo.setRamaCondicionIf(new Arbol(padre1.getCjtoFun(), cjtoTerIf, padre1.getHmax(), nodo.getProfundidad()+1, nodo.getPadre(),
                false, false, false, padre1.isCompleta()));
            }
            else{
                nodo.setNombre(fun);
                nodo.setHi(null);
            }
        }
        padre1.reestablecerNumNodos();
        padre1.reestablecerProfundidad();
        
    }
}
